package com.annotation.demo3;

import com.annotation.demo1.MyAnnotation;

import java.lang.reflect.Field;

/**
 * @ClassName AnnotationProcessor
 * @Description 注解处理器
 * @Author Kx
 * @Date 2025/3/28 11:40
 * @Version 1.0
 */
public class AnnotationProcessor {
    /***
     * @author: kx
     * @date: 2025/3/28 11:41
     * @param obj : 待验证的类
     * @description: 验证注解
    */
    public static void validate(Object obj) throws IllegalAccessException {
        // 获取类的class对象
        Class<?> clazz = obj.getClass();
        // 获取类的所有字段名
        for (Field field : clazz.getDeclaredFields()){
            // 判断字段上是否有MyAnnotation注解
            if (field.isAnnotationPresent(MyAnnotation.class)){
                // 获取字段上的MyAnnotation注解实例
                MyAnnotation annotation = field.getAnnotation(MyAnnotation.class);

                // 设置可访问性
                field.setAccessible(true);

                // 判断字段类型
                if(field.getType() == int.class){
                    // 获取字段值
                    int value = (int) field.get(obj);

                    // 判断字段值是否小于注解中的值
                    if (value < annotation.age()){
                        throw new IllegalArgumentException("年龄不合法");
                    }
                }
            }
        }
    }


    /***
     * @author: kx
     * @date: 2025/3/28 15:38
     * @param obj : 待验证的类
     * @description: 判断性别是否合法
    */
    public static void validateGender(Object obj) throws IllegalAccessException {
        // 获取类的class对象
        Class<?> clazz = obj.getClass();

        // 获取所有字段并循环遍历
        for (Field field : clazz.getDeclaredFields()) {
            // 判断字段上是否有GenderValidation注解
            if (field.isAnnotationPresent(GenderValidation.class)) {
                // 获取字段上的GenderValidation注解实例
                GenderValidation annotation = field.getAnnotation(GenderValidation.class);

                // 设置可访问性
                field.setAccessible(true);

                // 判断字段类型
                if (field.getType() == String.class) {
                    // 获取注解中的性别值
                    String[] sex = annotation.sex();

                    // 获取字段值
                    String value = (String) field.get(obj);

                    // 判断字段值是否在注解中的性别值中
                    boolean isValid = false;

                    // 循环判断字段值是否在注解中的性别值中
                    for (String str : sex){
                        if(value.equals(str)){
                            isValid = true;
                            break;
                        }
                    }
                    // 判断字段值是否在注解中的性别值中
                    if (!isValid){
                        throw new IllegalArgumentException("性别不合法");
                    }
                }
            }
        }
    }
}
